bool fun(vector<int>& rewardValues) {
    int m = rewardValues[rewardValues.size() - 1];
    unordered_set<int> window;
    for (int i : rewardValues) {
        if (window.contains(m - i - 1))
            return true;
        window.insert(i);
    }
    return false;
}
class Solution {
public:
    int maxTotalReward(vector<int> rewardValues) {
        sort(rewardValues.begin(), rewardValues.end());
        rewardValues.erase(unique(rewardValues.begin(), rewardValues.end()),
                           rewardValues.end());
        int m = rewardValues[rewardValues.size() - 1];
        if (fun(rewardValues))
            return 2 * m - 1;
        bitset<100005> num(1);
        int size = rewardValues.size();
        int ret = 0;
        for (int i = 0; i < size; i++) {
            int t = num.size() - rewardValues[i];
            // << t   翻2^t 倍，左移t个位置
            // >> t   变小2^t倍，右移t个位置，相当于去了 比rewardValues[i]
            // 大的数据
            // >> rewardValues[i]          比 rewardValues[i]
            // 小的还存在的数据都可以变为 + rewardValues[i]
            num = num | (num << t >> t << rewardValues[i]);
        }
        for (int i = m * 2 - 1;; i--) {
            if (num.test(i)) {
                return i;
            }
        }
    }
};